package com;

import java.util.Vector;

/**
 * @author 吴宇~
 * @motto 我亦无他，唯手熟尔。
 * @edition jdk1.8
 * @reflection 0-1 喧闹任其喧闹，自由我自为之，我自风情万种，与世无争。
 * @person Han Xiaojiu
 */
@SuppressWarnings("all")
public class EnemyTank extends Tank implements Runnable {
    //在敌人坦克类，使用Vector，放置shot
    Vector<Shot> shots = new Vector<>();//不同的坦克有不同的子弹集合
    //增加属性。EnemyTank可以得到敌人坦克的Vevtor
    Vector<EnemyTank> enemyTanks = new Vector<>();
    //1、敌人坦克的
    Boolean isLive = true;
    int shotNum = 0;


    //这里提供一个方法可以将Mypanle的enemyTanks的属性设置过来
    //有什么用呢?
    public void setEnemyTanks(Vector<EnemyTank> enemyTank) {
//        for (int i = 0; i < enemyTank.size(); i++) {
//            enemyTanks.add(enemyTank.get(i));
//        }
//        enemyTanks.add(hero);
        this.enemyTanks=enemyTank;
    }


    public EnemyTank(int x, int y, int direct) {
        super(x, y, direct);
        this.setSpeed(10);
    }


    //编写方法判断当前坦克是否和enemyTanks中的其他敌人坦克发生重叠或者碰撞,返回true或者false发生碰撞
    public boolean isTouchEnemyTank() {
        switch (this.getDirect()) {//根据敌人坦克的四个方向
            case 0:
                for (int i = 0; i < enemyTanks.size(); i++) {
                    //取出一个敌人坦克和其他所有坦克进行比较
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不和自己比较：
                    if (enemyTank != this) {//如下是判断我的坦克的上面两个角的判断
                        //如下是其他坦克的两种方向
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2) {
//                            当前坦克的上面的坦克两个点向上运动的时候不能到了另一个坦克的区域
                            //如下是拿自己坦克的两个边缘坐标比较
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 60) {//说明已经发生碰撞
                                return true;
                            }
                            //当前坦克的右上角坐标为getx+40，gety
                            if (this.getX() + 40 >= enemyTank.getX()
                                    && this.getX() + 40 <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 60) {//说明已经发生碰撞
                                return true;
                            }
                        }
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3) {
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 40) {//说明已经发生碰撞
                                return true;
                            }
                            //当前坦克的右上角坐标为getx+40，gety
                            if (this.getX() + 40 >= enemyTank.getX()
                                    && this.getX() + 40 <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 40) {//说明已经发生碰撞
                                return true;
                            }
                        }
                    }
                }
                break;
            case 1:
                for (int i = 0; i < enemyTanks.size(); i++) {
                    //取出一个敌人坦克和其他所有坦克进行比较
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不和自己比较：
                    if (enemyTank != this) {//如下是判断我的坦克的上面两个角的判断
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2) {
//                            当前坦克的上面的坦克两个点向上运动的时候不能到了另一个坦克的区域
                            if (this.getX() + 60 >= enemyTank.getX()
                                    && this.getX() + 60 <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 60) {//说明已经发生碰撞
                                return true;
                            }
                            if (this.getX() + 60 >= enemyTank.getX()
                                    && this.getX() + 60 <= enemyTank.getX() + 40
                                    && this.getY() + 40 >= enemyTank.getY()
                                    && this.getY() + 40 <= enemyTank.getY() + 60) {//说明已经发生碰撞
                                return true;
                            }
                        }
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3) {
                            if (this.getX() + 60 >= enemyTank.getX()
                                    && this.getX() + 60 <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 40) {//说明已经发生碰撞
                                return true;
                            }
                            if (this.getX() + 60 >= enemyTank.getX()
                                    && this.getX() + 60 <= enemyTank.getX() + 60
                                    && this.getY() + 40 >= enemyTank.getY()
                                    && this.getY() + 40 <= enemyTank.getY() + 40) {//说明已经发生碰撞
                                return true;
                            }
                        }
                    }
                }
                break;
            case 2:
                for (int i = 0; i < enemyTanks.size(); i++) {
                    //取出一个敌人坦克和其他所有坦克进行比较
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不和自己比较：
                    if (enemyTank != this) {//如下是判断我的坦克的上面两个角的判断
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2) {
//                            当前坦克的上面的坦克两个点向上运动的时候不能到了另一个坦克的区域
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() + 60 >= enemyTank.getY()
                                    && this.getY() + 60 <= enemyTank.getY() + 60) {//说明已经发生碰撞
                                return true;
                            }
                            if (this.getX() + 40 >= enemyTank.getX()
                                    && this.getX() + 40 <= enemyTank.getX() + 40
                                    && this.getY() + 60 >= enemyTank.getY()
                                    && this.getY() + 60 <= enemyTank.getY() + 60) {//说明已经发生碰撞
                                return true;
                            }
                        }
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3) {
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 60
                                    && this.getY() + 60 >= enemyTank.getY()
                                    && this.getY() + 60 <= enemyTank.getY() + 40) {//说明已经发生碰撞
                                return true;
                            }
                            if (this.getX() + 40 >= enemyTank.getX()
                                    && this.getX() + 40 <= enemyTank.getX() + 60
                                    && this.getY() + 60 >= enemyTank.getY()
                                    && this.getY() + 60 <= enemyTank.getY() + 40) {//说明已经发生碰撞
                                return true;
                            }
                        }
                    }
                }
                break;
            case 3:
                for (int i = 0; i < enemyTanks.size(); i++) {
                    //取出一个敌人坦克和其他所有坦克进行比较
//                    com.EnemyTank enemyTank = enemyTanks.get(i);
                    EnemyTank enemyTank = enemyTanks.get(i);
                    //不和自己比较：
                    if (enemyTank != this) {//如下是判断我的坦克的上面两个角的判断
                        if (enemyTank.getDirect() == 0 || enemyTank.getDirect() == 2) {
//                            当前坦克的上面的坦克两个点向上运动的时候不能到了另一个坦克的区域
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 60) {//说明已经发生碰撞
                                return true;
                            }
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 40
                                    && this.getY() + 40 >= enemyTank.getY()
                                    && this.getY() + 40 <= enemyTank.getY() + 60) {//说明已经发生碰撞
                                return true;
                            }
                        }
                        if (enemyTank.getDirect() == 1 || enemyTank.getDirect() == 3) {
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 60
                                    && this.getY() >= enemyTank.getY()
                                    && this.getY() <= enemyTank.getY() + 40) {//说明已经发生碰撞
                                return true;
                            }
                            if (this.getX() >= enemyTank.getX()
                                    && this.getX() <= enemyTank.getX() + 60
                                    && this.getY() + 40 >= enemyTank.getY()
                                    && this.getY() + 40 <= enemyTank.getY() + 40) {//说明已经发生碰撞
                                return true;
                            }
                        }
                    }
                }
                break;
        }
        return false;
        //这儿返回一个false，就是说默认不会重合。
    }

    @Override
    public void run() {

        //多线程的并发程序一定要考虑清楚该线程什么时候结束
        while (true) {

            //我们判断shots=0,我们就创建一颗子弹并启动它
            if (this.isLive && shots.size() < shotNum) {//坦克子弹存活且子弹数小于某个值
                Shot s = null;
                switch (getDirect()) {
                    case 0:
                        s = new Shot(getX() + 20, getY(), 0);
                        break;
                    case 1:
                        s = new Shot(getX() + 60, getY() + 20, 1);
                        break;
                    case 2:
                        s = new Shot(getX() + 20, getY() + 60, 2);
                        break;
                    case 3:
                        s = new Shot(getX(), getY() + 20, 3);
                        break;
                    //不同方向的子弹
                }
                shots.add(s);
                //启动
                new Thread(s).start();//启动的是子弹线程
            }
            //随机的改变坦克方向，还得放在最前面，都是随机的
            setDirect((int) (Math.random() * 4));
            //根据坦克的方向来继续移动.bug在于速度，可能一不小心出去
            switch (getDirect()) {
                case 0:
                    //让坦克保持某个反向走几步！！
                    for (int i = 0; i < 30; i++) {
                        if (getY() > 0 && !isTouchEnemyTank()) {
                            MoveUp();//每次移动只移动一个像素点，这么设置的话是1.5秒改变方向
                        }
                        try {
                            //休眠时间来控制转向频率
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 1:
                    for (int i = 0; i < 30; i++) {
                        if (getX() + 60 < 1000 && !isTouchEnemyTank()) {
                            MoveRight();
                        }
                        try {
                            //休眠时间来控制转向频率
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 2:
                    for (int i = 0; i < 30; i++) {
                        if (getY() + 60 < 750 && !isTouchEnemyTank()) {
                            MoveDown();
                        }
                        try {
                            //休眠时间来控制转向频率
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
                case 3:
                    for (int i = 0; i < 30; i++) {
                        if (getX() > 0 && !isTouchEnemyTank()) {
                            MoveLeft();
                        }
                        try {
                            //休眠时间来控制转向频率
                            Thread.sleep(50);
                        } catch (InterruptedException e) {
                            e.printStackTrace();
                        }
                    }
                    break;
            }

            //随机的改变坦克方向
            setDirect((int) (Math.random() * 4));
            //多线程的并发程序一定要考虑清楚该线程什么时候结束
            if (!isLive) {//某一个实例的EnemyTank对象调用这个方法，就这个对象开启的线程结束
                break;
            }
        }
    }
}
